<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>姓名案例_watch实现</title>
		<!-- 引入Vue -->
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 
				computed和watch之间的区别：
						1.computed能完成的功能，watch都可以完成。
						2.watch能完成的功能，computed不一定能完成，例如：watch可以进行异步操作。
				两个重要的小原则：
							1.所被Vue管理的函数，最好写成普通函数，这样this的指向才是vm 或 组件实例对象。
							2.所有不被Vue所管理的函数（定时器的回调函数、ajax的回调函数等、Promise的回调函数），最好写成箭头函数，
								这样this的指向才是vm 或 组件实例对象。
		-->
		<!-- 准备好一个容器-->
		<div id="root">
			姓：<input type="text" v-model="firstName"> <br/><br/>
			名：<input type="text" v-model="lastName"> <br/><br/>
			全名：<span>{{fullName}}</span> <br/><br/>
		</div>
	</body>

	<script type="text/javascript">
		Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

		const vm = new Vue({
			el:'#root',
			data:{
				firstName:'张',
				lastName:'三',
				fullName:'张-三'
			},
			//改名之后停1s后再变化
			watch:{
				firstName(val){
					setTimeout(()=>{
						console.log(this)
						this.fullName = val + '-' + this.lastName
					},1000);
				},
				lastName(val){
					this.fullName = this.firstName + '-' + val
				}
			},
			computed: {
				fullName(){
					setTimeout(()=>{
						return this.firstName + '-' + this.lastName
					},1000);  //这个返回值是给了setTimeout里面的函数而不是返回给fullName计算属性，setTimeout的返回值是数字
					//定时器是在fullName中开启的但是 定时器当中的回调函数不是vue控制的 是浏览器中的定时器管理模块控制的，定时器到点了是浏览器
					// 引擎帮忙调用的

					// 分析：这里面的定时器函数必须写成箭头函数：箭头函数找不到自身的this会往外找，因此this就会指向vue实例
					return undefined; //默认返回undefined了  
				}
			},
		})
	</script>
</html>